﻿using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Persistencia_y_capa_de_negocio;
using System.Collections;

namespace clonegame
{
    public partial class formularioRecursos : UserControl
    {
        /// <summary>
        /// Estado de la aplicación para saber si perdemos información
        /// </summary>
        private string estado = "editar";
        public string Estado
        {
            get { return estado; }
            set { estado = value; }
        }

        public ArrayList lista;

        public ArrayList Lista
        {
            get { return lista; }
            set { lista = value; }
        }

        /// <summary>
        /// Instancia del formulario, esto es lo que verán el resto de instancias desde fuera.
        /// </summary>
        private static readonly formularioRecursos instancia = new formularioRecursos();

        public static formularioRecursos Instancia
        {
            get { return instancia; }
        }

        private bool cambio;

        public formularioRecursos()
        {
            InitializeComponent();
            cambio = true;
            estado = "editar";

            MuestraForm(formularioRecursoEditar.Instancia);
        }

        private void formularioRecursos_Load(object sender, EventArgs e)
        {
            if (cambio)
            {
                RellenaDGV(false);
                cambio = false;
            }
        }

        /// <summary>
        /// Rellena el dataGrid con toda la información de la base de datos.
        /// </summary>
        /// <param name="creado"></param>
        public void RellenaDGV(bool creado)
        {
            int numFilas = 0;
            lista = CADRecurso.Instancia.getRecursos();
            dgvRecursos.Rows.Clear();

            string mdf = Application.ExecutablePath;
            mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));

            string mdf2 = mdf.Remove(mdf.LastIndexOf(@"\clonegame"));
            mdf2 += @"\clonegame\imagenes\recursos\";
            int i = 0;
            foreach (ENRecurso re in lista)
            {
                if (i == 0)
                {
                    // Comprobamos si la unidad existe.
                    if (re != null && creado == false)
                    {
                        // Pasamos al estado de edición.
                        estado = "editar";

                        // Cargamos el formulario de edición.
                        MuestraForm(formularioRecursoEditar.Instancia);

                        // Completamos la información del formulario.
                        formularioRecursoEditar.Instancia.cargarDatos(re.Nombre, re.Ratio.ToString(), re.Descripcion);
                    }
                }
                i++;

                dgvRecursos.Rows.Add(1);
                try
                {
                    dgvRecursos.Rows[numFilas].Cells[0].Value = System.Drawing.Image.FromFile(mdf2 + re.Nombre + ".png");
                }
                catch (Exception)
                {
                    dgvRecursos.Rows[numFilas].Cells[0].Value = clonegame.Properties.Resources.RecursoNoEncontrado;
                }
                dgvRecursos.Rows[numFilas].Cells[1].Value = re.Nombre.ToString();
                numFilas++;
            }

            if (lista.Count == 0)
            {
                formularioRecursoEditar.Instancia.BorraForm();
            }

            if (creado == true)
            {
                dgvRecursos.SelectedRows[0].Selected = false;
                dgvRecursos.Rows[dgvRecursos.Rows.Count - 1].Selected = true;
            }
        }

        /// <summary>
        /// Rellena el dataGrid con la información resultante de la búsqueda.
        /// </summary>
        public void RellenarBusqueda()
        {
            int numFilas = 0;
            dgvRecursos.Rows.Clear();

            string mdf = Application.ExecutablePath;
            mdf = mdf.Remove(mdf.LastIndexOf(@"\bin\"));

            string mdf2 = mdf.Remove(mdf.LastIndexOf(@"\clonegame"));
            mdf2 += @"\clonegame\imagenes\recursos\";
            int i = 0;
            foreach (ENRecurso re in lista)
            {
                if (i == 0)
                {
                    // Comprobamos si la unidad existe.
                    if (re != null)
                    {
                        // Pasamos al estado de edición.
                        estado = "editar";

                        // Cargamos el formulario de edición.
                        MuestraForm(formularioRecursoEditar.Instancia);

                        // Completamos la información del formulario.
                        formularioRecursoEditar.Instancia.cargarDatos(re.Nombre, re.Ratio.ToString(), re.Descripcion);
                    }
                }
                i++;

                dgvRecursos.Rows.Add(1);
                try
                {
                    dgvRecursos.Rows[numFilas].Cells[0].Value = System.Drawing.Image.FromFile(mdf2 + re.Nombre + ".png");
                }
                catch (Exception)
                {
                    dgvRecursos.Rows[numFilas].Cells[0].Value = clonegame.Properties.Resources.RecursoNoEncontrado;
                }
                dgvRecursos.Rows[numFilas].Cells[1].Value = re.Nombre.ToString();
                numFilas++;
            }
        }

        public void MuestraForm(UserControl o)
        {
            pRecursos.Controls.Clear();
            pRecursos.Controls.Add(o);
            o.Dock = DockStyle.Fill;
        }

        private void btAnadir_Click(object sender, EventArgs e)
        {
            if (estado != "editar")
            {
                MuestraForm(formularioRecursoEditar.Instancia);
            }

            // Vaciamos el formulario para que el usuario pueda insertar el nuevo edificio.

            formularioRecursoEditar.Instancia.BorraForm();
        }

        /// <summary>
        /// Elimina los recursos seleccionados.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btEliminar_Click(object sender, EventArgs e)
        {
            ArrayList seleccionados = new ArrayList();
            int seleccionadas = dgvRecursos.SelectedRows.Count;
            if (seleccionadas < 1)
            {
                MessageBox.Show("Debe seleccionar algún recurso primero.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
            }
            else if (seleccionadas == 1)
            {
                string nombreRecurso = dgvRecursos.SelectedRows[0].Cells[1].Value.ToString();
                if (MessageBox.Show("¿Desea eliminar el recurso " + nombreRecurso + "?", "Información", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                {
                    // Borramos su imagen

                    string destino = Application.ExecutablePath;
                    destino = destino.Remove(destino.LastIndexOf(@"\bin\"));
                    destino += @"\imagenes\recursos";
                    destino += @"\" + dgvRecursos.SelectedRows[0].Cells[1].Value.ToString() + ".png";

                    string nombre = dgvRecursos.SelectedRows[0].Cells[1].Value.ToString();

                    // Código para trasladar la imágen también a la web.
                    string destinoWeb = Application.ExecutablePath;
                    destinoWeb = destinoWeb.Remove(destinoWeb.LastIndexOf(@"\clonegame\"));
                    destinoWeb += @"\webclonegame\FormulariosPrivada\ImagenesPrivada\recursos";
                    destinoWeb += @"\" + nombre + ".png";


                    //dgvRecursos.Rows.Clear();

                    formularioRecursoEditar.Instancia.pbImg.Image.Dispose();

                    ((Image)dgvRecursos.SelectedRows[0].Cells[0].Value).Dispose();

                    System.GC.Collect();
                    System.GC.WaitForPendingFinalizers();

                    CADRecurso.Instancia.EliminaRecurso(nombre);

                    RellenaDGV(false);

                    ENActividad act = new ENActividad();
                    act.Accion = "Baja";
                    act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                    act.Descripcion = "Ha dado de baja el recurso " + nombreRecurso + ".";
                    act.Fecha = DateTime.Now.ToString();
                    CADActividad.Instancia.InsertarActividad(act);

                    if(File.Exists(destino))
                    {
                        File.Delete(destino);
                    }

                    if (File.Exists(destinoWeb))
                    {
                        File.Delete(destinoWeb);
                    }
                    
                }
            }
            else
            {
                if (MessageBox.Show("¿Desea eliminar " + seleccionadas + " recursos?", "Información", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                {
                    int i = 0;

                    foreach (DataGridViewRow r in dgvRecursos.SelectedRows)
                    {
                        CADRecurso.Instancia.EliminaRecurso(r.Cells[1].Value.ToString());
                        string destino = Application.ExecutablePath;
                        destino = destino.Remove(destino.LastIndexOf(@"\bin\"));
                        destino += @"\imagenes\recursos";
                        destino += @"\" + r.Cells[1].Value.ToString() + ".png";

                        // Código para trasladar la imágen también a la web.
                        string destinoWeb = Application.ExecutablePath;
                        destinoWeb = destinoWeb.Remove(destinoWeb.LastIndexOf(@"\clonegame\"));
                        destinoWeb += @"\webclonegame\FormulariosPrivada\ImagenesPrivada\recursos";
                        destinoWeb += @"\" + r.Cells[1].Value.ToString() + ".png";

                        ((Image)r.Cells[0].Value).Dispose();

                        if (formularioRecursoEditar.Instancia.pbImg.Image != null)
                        {
                            formularioRecursoEditar.Instancia.pbImg.Image.Dispose();
                        }

                        System.GC.Collect();
                        System.GC.WaitForPendingFinalizers();

                        File.Delete(destino);
                        File.Delete(destinoWeb);
                        i++;
                    }

                    RellenaDGV(false);

                    ENActividad act = new ENActividad();
                    act.Accion = "Baja";
                    act.Responsable = formularioMaestro.Instancia.UsuarioLogueado.CuentaAd;
                    act.Descripcion = "Ha dado de baja " + seleccionadas + " recursos.";
                    act.Fecha = DateTime.Now.ToString();
                    CADActividad.Instancia.InsertarActividad(act);
                }
            }
            // Actualizamos el DGV de bienvenida.
            formularioBienvenida.Instancia.actualizaResumen();
        }

        /// <summary>
        /// Evento para cargar la información del recurso seleccionado en el formulario.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dgvRecursos_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (estado == "editando")
            {
                if (MessageBox.Show("Si selecciona otro recurso, perderá la información que no ha guardado", "Información", MessageBoxButtons.OKCancel) == DialogResult.OK)
                {
                    if (e.RowIndex >= 0)
                    {
                        // Obtenemos la información de la unidad.
                        string nombreRecurso = dgvRecursos.Rows[e.RowIndex].Cells[1].Value.ToString();
                        ENRecurso re = CADRecurso.Instancia.getRecurso(nombreRecurso);

                        // Comprobamos si la unidad existe.
                        if (re != null)
                        {
                            // Pasamos al estado de edición.
                            estado = "editar";

                            // Cargamos el formulario de edición.
                            MuestraForm(formularioRecursoEditar.Instancia);

                            // Completamos la información del formulario.
                            formularioRecursoEditar.Instancia.cargarDatos(re.Nombre, re.Ratio.ToString(), re.Descripcion);
                        }
                        else
                        {
                            // Mostramos un error.

                        }
                    }
                }
                else
                {
                    dgvRecursos.ClearSelection();
                }
            }
            else
            {
                if (e.RowIndex >= 0)
                {
                    // Obtenemos la información de la unidad.
                    string nombreRecurso = dgvRecursos.Rows[e.RowIndex].Cells[1].Value.ToString();
                    ENRecurso re = CADRecurso.Instancia.getRecurso(nombreRecurso);

                    // Comprobamos si la unidad existe.
                    if (re != null)
                    {
                        // Pasamos al estado de edición.
                        estado = "editar";

                        // Cargamos el formulario de edición.
                        MuestraForm(formularioRecursoEditar.Instancia);

                        // Completamos la información del formulario.
                        formularioRecursoEditar.Instancia.cargarDatos(re.Nombre, re.Ratio.ToString(), re.Descripcion);
                    }
                    else
                    {
                        // Mostramos un error.

                    }
                }
            }

            
        }

        private void dgvRecursos_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 46)
            {
                EventArgs ea = null;
                btEliminar_Click(sender, ea);
            }
        }

        private void formularioRecursos_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 46)
            {
                EventArgs ea = null;
                btEliminar_Click(sender, ea);
            }
        }

    }
}
